package com.coder.rental.utils;

import com.coder.rental.entity.Permission;
import com.coder.rental.vo.RouteVo;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @author: zhanglin
 * @description:  基于权限列表构建一个树形的路由菜单结构，采用递归算法处理每个权限结点的子节点，
 * 构建完整的属树形JSON数据结构
 * @date 2025/3/30
 */
public class RouteTreeUtils {
   /*
   * 基于权限列表和父权限ID构建路由树
   * permissionList权限列表，包含所有路由的权限信息
   * pid父权限ID，用于筛选特定父级下的路由
   * 返回一个路由树的列表，每个路由包含路劲、名称、组件等信息，以及子路由
   * */
    public static List<RouteVo> buildRouteTree(List<Permission> permissionList,int pid){
        List<RouteVo> routeVoList = new ArrayList<>();
        //从权限列表中筛选出父ID为pid的权限，并为每个权限构建一个RouteVO实例
        Optional.ofNullable(permissionList).orElse(new ArrayList<>())
                .stream()
                .filter(permission -> permission!=null && permission.getPid() == pid)
                .forEach(permission -> {
                    RouteVo routeVo = new RouteVo();
                    routeVo.setPath(permission.getRoutePath());//设置路由路径
                    routeVo.setName(permission.getRouteName());//设置路由名称
                    //判断是否为根路径菜单，也就是pid==0，并设置相应组件和显示属性
                    if(permission.getPid() == 0){
                        routeVo.setComponent("Layout");
                        routeVo.setAlwaysShow(true);
                    }else{
                        routeVo.setComponent(permission.getRouteUrl());
                        routeVo.setAlwaysShow(false);
                    }
                    //设置路由的元信息，包括权限标签、图标、权限代码
                    routeVo.setMeta(routeVo.new Meta(
                            permission.getPermissionLable(),
                            permission.getIcon(),
                            permission.getPermissionCode().split(",")));
                    //递归构建该权限下的子路由树
                    List<RouteVo> children = buildRouteTree(permissionList, permission.getId());
                    routeVo.setChildren(children);
                    routeVoList.add(routeVo);
                });
        return routeVoList;
    }
}
